import axios from 'axios';
import type { AxiosRequestConfig, AxiosResponse } from 'axios';
import { showMsg } from '@/util/toast';
// 创建一个 axios的应用实例 里面可以进行一些基础的配置
const $api = axios.create({
  baseURL: 'http://127.0.0.1:3030', // 公共前置链接
});

// 请求拦截  指在发送请求之前对于要发送的信息进行最后的处理的一个流程
$api.interceptors.request.use((config: AxiosRequestConfig) => {
  // 有一些公司要求对于请求的传递的参数进行序列化 qs流程 这个时候也是需要再请求拦截当中处理
  // 在请求前 判断时候localStorage当中有token 如果有的话 就在请求头当中 携带上这个token
  const actk = window.localStorage.getItem('accessToken');
  // eslint-disable-next-line no-param-reassign
  if (actk) config.headers.Authorization = `bearer ${actk}`;
  return config;
});

// 响应拦截$api.interceptors.response.use(成功请求的回调,处理错误的回调)
$api.interceptors.response.use(
  (response: AxiosResponse) => response,
  (err) => {
    let message = '';
    switch (err.response.status) {
      case 401:
        message = '未授权请重新登录';
        break;
      case 403:
        message = '服务器拒绝访问';
        break;
      default:
        message = `请求错误${err.request.status}`;
    }

    showMsg(message); // 使用一些全局的提示的插件来 可以提示我们的错误信息
  },
);

export default $api;
